/*
 * MIT License
 *
 * Copyright (c) 2023-present, tangli
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package tony.test.mybatis.datascope.mapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper
import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Param
import org.apache.ibatis.annotations.Select
import tony.test.mybatis.datascope.entity.SysDict

/**
 * 字典Mapper
 */
@Mapper
interface SysDictMapper : BaseMapper<SysDict> {

    /**
     * 分页查询字典
     */
    @Select("SELECT * FROM sys_dict WHERE build_in = #{buildIn}")
    fun selectDictPage(page: Page<SysDict>, @Param("buildIn") buildIn: Boolean): Page<SysDict>

    /**
     * 查询指定类型的字典
     */
    @Select("SELECT * FROM sys_dict WHERE dict_type_id = #{dictTypeId} AND build_in = #{buildIn}")
    fun selectByTypeId(page: Page<SysDict>, @Param("dictTypeId") dictTypeId: String, @Param("buildIn") enabled: Boolean): Page<SysDict>

    /**
     * 复杂联表查询
     */
    @Select("""
        SELECT d.*, t.dict_type_name
        FROM sys_dict d
        LEFT JOIN sys_dict_type t ON d.dict_type_id = t.dict_type_id
        WHERE d.build_in = #{buildIn} AND t.build_in = #{buildIn}
        ORDER BY d.sort, d.create_time
    """)
    fun selectDictWithType(page: Page<SysDict>, @Param("buildIn") buildIn: Boolean): Page<SysDict>

    /**
     * 条件分页查询
     */
    @Select("""
        SELECT * FROM sys_dict
        WHERE build_in = #{buildIn}
        AND (#{dictName} IS NULL OR dict_name LIKE CONCAT('%', #{dictName}, '%'))
        AND (#{dictTypeId} IS NULL OR dict_type_id = #{dictTypeId})
        ORDER BY sort, create_time DESC
    """)
    fun selectByCondition(
        page: Page<SysDict>,
        @Param("buildIn") buildIn: Boolean,
        @Param("dictName") dictName: String?,
        @Param("dictTypeId") dictTypeId: String?
    ): Page<SysDict>
}
